home *** CD-ROM | disk | FTP | other *** search
- program SpeedTests;
-
- {$IFDEF Windows}
- !! Error - this test program is for Win32 only
- {$ENDIF}
-
- {$APPTYPE CONSOLE}
-
- uses
- Windows,
- SysUtils;
-
- const
- ItemCount = 10000;
- Third = 1.0 / 3.0;
-
- type
- PSingleArray = ^TSingleArray;
- TSingleArray = array [0..pred(ItemCount)] of single;
- PDoubleArray = ^TDoubleArray;
- TDoubleArray = array [0..pred(ItemCount)] of double;
- PExtendedArray = ^TExtendedArray;
- TExtendedArray = array [0..pred(ItemCount)] of extended;
-
- PPointerArray = ^TPointerArray;
- TPointerArray = array [0..2] of pointer;
-
- function GetMisAlignedDoubleArray : PDoubleArray;
- var
- P : PPointerArray;
- begin
- GetMem(P, sizeof(TDoubleArray) + 8);
- if ((longint(P) mod 8) = 0) then begin
- P^[0] := P;
- Result := pointer(@P^[1]);
- end
- else begin
- P^[1] := P;
- Result := pointer(@P^[2]);
- end;
- end;
-
- function GetAlignedDoubleArray : PDoubleArray;
- var
- PA : PPointerArray;
- begin
- GetMem(PA, sizeof(TDoubleArray) + 8);
- if ((longint(PA) mod 8) <> 0) then begin
- PA^[0] := PA;
- Result := pointer(@PA^[1]);
- end
- else begin
- PA^[1] := PA;
- Result := pointer(@PA^[2]);
- end;
- end;
-
- procedure FreeDoubleArray(DA : PDoubleArray);
- var
- P : PChar;
- PA : PPointerArray;
- begin
- P := PChar(DA);
- dec(P, sizeof(pointer));
- PA := pointer(P);
- FreeMem(PA^[0]);
- end;
-
- var
- StartTime : DWORD;
- EndTime : DWORD;
- SA : PSingleArray;
- DA : PDoubleArray;
- EA : PExtendedArray;
- i : integer;
- j : integer;
-
- begin
- {perform test on single array}
- writeln('Running tests on singles...');
- New(SA);
- SA^[0] := pi;
- StartTime := GetTickCount;
- for j := 1 to 1000 do
- for i := 1 to pred(ItemCount) do
- SA^[i] := SA^[i-1] + SA^[0] * Third;
- EndTime := GetTickCount;
- Dispose(SA);
- writeln('Single test: ', EndTime - StartTime);
-
-
- {perform test on misaligned double array}
- writeln('Running tests on misaligned doubles...');
- DA := GetMisalignedDoubleArray;
- DA^[0] := pi;
- StartTime := GetTickCount;
- for j := 1 to 1000 do
- for i := 1 to pred(ItemCount) do
- DA^[i] := DA^[i-1] + DA^[0];
- EndTime := GetTickCount;
- FreeDoubleArray(DA);
- writeln('Misaligned Double test: ', EndTime - StartTime);
-
-
- {perform test on aligned double array}
- writeln('Running tests on aligned doubles...');
- DA := GetAlignedDoubleArray;
- DA^[0] := pi;
- StartTime := GetTickCount;
- for j := 1 to 1000 do
- for i := 1 to pred(ItemCount) do
- DA^[i] := DA^[i-1] + DA^[0];
- EndTime := GetTickCount;
- FreeDoubleArray(DA);
- writeln('Aligned Double test: ', EndTime - StartTime);
-
-
- {perform test on extended array}
- writeln('Running tests on extendeds...');
- New(EA);
- EA^[0] := pi;
- StartTime := GetTickCount;
- for j := 1 to 1000 do
- for i := 1 to pred(ItemCount) do
- EA^[i] := EA^[i-1] + EA^[0];
- EndTime := GetTickCount;
- Dispose(EA);
- writeln('Extended test: ', EndTime - StartTime);
-
- readln;
- end.
-
-
-